Il Fantacalcio è stato definito come “il gioco più bello del mondo dopo il calcio”. Per svariate persone questa affermazione potrebbe essere un’assurdità, qualcosa di totalmente illogico, ma qualcuno che ama il calcio potrebbe apprezzarla e comprenderla. Io rientro tra coloro che condividono quella frase. Ma che cos’è di preciso il Fantacalcio? Si tratta del più popolare fantasy game sul calcio, giocato da milioni di persone. Fu stato inventato da Riccardo Albini, giornalista italiano, nel 1988 e raggiunse la popolarità in tutta Italia nel 1994 grazie alla collaborazione con La Gazzetta dello Sport. Da quel momento infatti il quotidiano sportivo accolse il gioco sulle sue pagine, fornendo le votazioni (di giornata in giornata) per calcolare i punteggi delle squadre di calcio viruali (chiamate fantasquadre). L’iniziativa raccolse molto successo, in quanto ci si aspettavano circa 10.000 partecipanti, ma nel corso dell’anno si raggiunsero 70.000 iscritti.
L’obiettivo di questo gioco è quello di comporre una fantasquadra formata da 25 giocatori reali scelti tra le squadre di serie A, di gestirla e di schierarla in campo durante le varie giornate del campionato per cercare di conquistare il fantascudetto di Lega. Terminata ogni giornata la fantasquadra otterrà un punteggio che è dato dalla somma algebrica dei punteggi dei singoli giocatori. I calciatori che portano punti alla fantaquadra sono solo i titolari che hanno ottenuto punteggio ai fini del gioco e gli eventuali calciatori della panchina che hanno sostituito coloro, tra i titolari, che non hanno ricevuto punteggio. Però, ciò che più conta è capire come viene determinato il punteggio di ogni giocatore (detto fanta voto); questo dipende dal voto pubblicato sulla Gazzetta dello Sport al quale possono sommarsi dei bonus e sottrarsi dei malus.
In questa analisi il mio obiettivo è scoprire più nel dettaglio questo gioco; l’analisi prende in considerazione gli ultimi 7 campionati di serie A, partendo quindi dalla stagione 2011/2012 e arrivando alla stagione 2017/2018, anno in cui la Juventus è riuscita a conquistare il suo settimo scudetto consecutivo. In particolare, le domande a cui vorrei dare una risposta, dopo aver fatto un’analisi esplorativa sui dati raccolti, sono le seguenti:
Per questa analisi sono stati utilizzati 3 dataset, costruiti grazie a dati ricavati da 3 diversi siti internet, i quali fornivano informazioni suddivise in base agli anni.
Questa tabella è composta da 3676 righe, le quali restituiscono informazioni sulle statistiche del fantacalcio, dei 7 anni presi in considerazione divise per ruolo, di tutti i giocatori della Serie A con almeno una presenza. Quindi se si fissa l’attenzione su un singolo anno, nella tabella ci saranno tutti i giocatori che hanno collezionato almeno una presenza. Le variabili sono le seguenti:
| BONUS | PUNTI |
|---|---|
| Per ogni gol segnato da un attaccante | 3 |
| Per ogni gol segnato da un centrocampista | 4 |
| Per ogni gol segnato da un difensore | 4,5 |
| Per ogni assist effettuato | 1 |
| Per ogni rigore parato | 3 |
| MALUS | PUNTI |
| Per ogni ammonizione | - 0,5 |
| Per ogni espulsione | - 1 |
| Per ogni autogol | - 2 |
| Per ogni rigore sbagliato | - 3 |
| Per ogni goal subito dal portiere | - 1 |
Questo dataset contiene le valutazioni iniziali di ogni singolo giocatore pubblicate sul sito della Gazzetta dello Sport, verso fine agosto. In questo dataset sono contenute anche le valutazioni di giocatori che poi, durante una certa stagione, non hanno collezionato presenze. Di seguito si analizzano le variabili contenute:
La valutazione di un giocatore può subire variazioni durante il corso delle partie, in base al rendimento, ma ciò che conta per questa analisi è solamente la valutazione iniziale.
Questo dataset contiene informazioni sulle squadre di serie A delle ultime 7 stagioni. Le variabili sono le seguenti:
Ci sono alcune variabili in questo dataset che non sono necessarie, ovvero le variabili giocate, vittorie, pareggi, sconfitte, GF e GS siccome per l’analisi voglio concentrarmi sulla distinzione tra partite in casa e partite in trasferta; nel seguito quindi verranno eliminate.
Prima di partire con l’analisi del dataset, una cosa importante è capire lo schema concettuale e lo schema relazionale dei dati siccome quest’ultimo sarà utile durante le operazioni di join. Partendo dallo schema concettuale possiamo quindi dire che sono presenti 3 entità :
C’è una relazione di tipo 1:1 tra giocatori e valutazioni, in quanto un’istanza dell’entità giocatori più essere associata ad un’istanza dell’entità valutazioni e vale il viceversa (ricordando però che istanze dell’entità valutazioni potrebbero non trovare una corrispondenza tra le istanze dell’altra entità); c’è inoltre una relazione di tipo 1:molti tra giocatori e squadre. Passando allo schema relazionale, le tre entità del modello concettuale vengono tradotte in tabelle (la cui struttura è stata già analizzata); per quanto riguarda le relazioni, se vogliamo far parlare tra di loro le tabelle giocatori e valutazioni allora bisognerà inserire la relazione nella tabella giocatori (siccome per l’analisi si considerano solo giocatori con almeno una presenza e quindi con almeno 1 voto), così come per la relazione di tipo 1:molti dove la chiave esterna formata da squadra e anno della tabella giocatori corrisponderà alla chiave primaria (formata da squadra e anno) della tabella squadre.
Di seguito l’elenco dei pacchetti che saranno necessari per lo scolgimento delle analisi:
I dati si trovano in formato .csv, quindi la prima cosa che bisogna fare è importarli, sfruttando il pacchetto readr di tidyverse.
I dati non hanno bisogno di particolari aggiustamenti siccome sono già in forma normale ordinata, ovvero i tre vincoli sono soddisfatti:
Prima di partire con l’analisi però bisogna controllare che i vincoli di chiave primaria e i vincoli di chiave esterna siano soddisfatti. Siccome nella tabella giocatori e nella tabella squadre ci sono due variabili che hanno lo steso nome (GS) ma vogliono dire cose diverse (in quanto il dato presente nella tabella squadre è un dato aggregato sui goal subiti dalla squadra), come prima cosa si procede cambiando il nome della variabile GS della tabella giocatori rinominandola con GSUB.
#Tabella giocatori
giocatori<-rename(giocatori,GSUB=GS)
giocatori%>%
count(giocatore, anno)%>%
filter(n>1)## # A tibble: 0 x 3
## # ... with 3 variables: giocatore <chr>, anno <int>, n <int>
## # A tibble: 0 x 3
## # ... with 3 variables: giocatore <chr>, anno <int>, n <int>
## # A tibble: 0 x 3
## # ... with 3 variables: squadra <chr>, anno <int>, n <int>
## # A tibble: 0 x 3
## # ... with 3 variables: anno <int>, giocatore <chr>, n <int>
## # A tibble: 0 x 3
## # ... with 3 variables: anno <int>, squadra <chr>, n <int>
Ora che i vincoli sono stati verificati, si procede ordinando i dataset e, per quanto riguarda la tabella squadre, si vanno ad eliminare alcune variabili in modo da focalizzare l’attenzione su partite in casa e partite in trasferta. Inoltre, sempre nella tabella squadre, si aggiungono due colonne DR_CASA e DR_TRASF che sono rispettivamente la differenza tra i goal fatti e i goal subiti in casa e in trasferta.
#Tabella giocatori
giocatori<-arrange(giocatori,desc(anno,giocatore))%>%
select(anno,giocatore,squadra,ruolo,everything())
# Tabella valutazioni
valutazioni<-arrange(valutazioni,desc(anno,giocatore))
# Tabella squadre
squadre<- mutate(squadre,DR_CASA= GF_CASA - GS_CASA, DR_TRASF= GF_TRASF - GS_TRASF)%>%
select(anno,squadra,punti,(VC:GS_CASA), DR_CASA, (VT:GS_TRASF), DR_TRASF)%>%
arrange(desc(anno,punti))Una volta che le tabelle sono state sistemate, una cosa molto importante da fare è un’analisi esplorativa per capire struttura e variazioni delle singole variabili e inoltre cercare di scoprire se esistono delle relazioni tra le variaibli. Concentriamoci sulla tabella giocatori.
## # A tibble: 1,510 x 2
## giocatore n
## <chr> <int>
## 1 AARONS Rolando 1
## 2 ABATE Ignazio 7
## 3 ABBIATI Christian 5
## 4 ABBRUSCATO Elvis 1
## 5 ABDI Almen 1
## 6 ABERO Mathias 1
## 7 ACERBI Francesco 7
## 8 ACOSTY Boadu Maxwell 2
## 9 ACQUAFRESCA Robert 4
## 10 ACQUAH Afriyie 7
## # ... with 1,500 more rows
In questa tabella ci sono 3676 righe, che forniscono informazioni sui giocatori. Fissata la finestra di osservazione di 7 anni, un singolo giocatore può aver giocato in serie A in più di una stagione. Il numero di giocatori distinti sono 1510. Vediamo le correlazioni tra le variabili, usando la visualizzazione della matrice di correlazione:
giocatori1<-select(giocatori,-giocatore,-anno,-squadra,-ruolo)
giocatoricorr<-cor(giocatori1)
corrplot(giocatoricorr, method="ellipse", diag= FALSE, order= "hclust", title="Correlazioni tra le variabili del dataset giocatori", mar=c(0,0,4,0)) Da questa visualizazzione si nota come la variabile FMV sia fortemente correlata con la variabile GOAL, tutto ciò non è una scoperta siccome, in caso di goal, il gicoatore ottiene un bonus molto alto, pari a 3, 4 o 4.5 punti a seconda che sia attaccante, centrocampista o difensore. Tutto ciò si può vedere molto meglio tramite uno scatter plot in cui vengono inseriti anche i ruoli dei giocatori:
a<-giocatori%>%
filter(ruolo !="P")%>%
ggplot(aes(x=G,y=FMV,color=ruolo,frame=anno))+
geom_point()+
theme_light()+
labs(title="Il FMV aumenta all'aumentare del numero dei goal")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(a)giocatori%>%
filter(ruolo!="P")%>%
ggplot(aes(x=reorder(ruolo,G,FUN=median),y=G))+
geom_boxplot()+
theme_light()+
labs(title="Boxplot distribuzione GOAL per RUOLO", x="ruolo",y = "goal")+
theme(plot.title = element_text(hjust = 0.5))+
coord_cartesian(ylim = c(0, 38)) Dal boxplot si vede come la mediana degli attaccanti sia superiore a quella dei centrocampisti e si nota anche che gli attaccati possono raggiungere valori di goal molto alti. Un’altra variaible che, dalla matrice di correlazione, risulta essere correlata con il FMV sono il numero di assist effettuati.
b<-giocatori%>%
filter(ruolo!="P")%>%
ggplot(aes(x=A, y=FMV,color=ruolo,frame=anno))+
geom_point()+
theme_light()+
labs(title="Il FMV aumenta all'aumentare del numero di assist effettuati")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(b)giocatori%>%
filter(ruolo!="P")%>%
ggplot(aes(x=reorder(ruolo,A,FUN=median),y=A))+
geom_boxplot()+
theme_light()+
labs(title="Boxplot distribuzione ASSIST per RUOLO", x="ruolo", y = "assist")+
theme(plot.title = element_text(hjust = 0.5))+
coord_cartesian(ylim = c(0, 15)) Il risultato è il 75% della variabilità degli assist è uguale per attaccanti e centrocampisti, ma i centrocampisti possono effettuare più assist.
Mettendo assieme i risultati ottenuti si va a vedere qual è il ruolo che ottiene un FMV più alto, considerando quindi tutti i fattori che possono incidere sul FMV:
giocatori%>%
ggplot() +
stat_summary(
mapping = aes(x = ruolo, y = FMV),
fun.ymin = min,
fun.ymax = max,
fun.y = median,
colour="blue"
)+
theme_light()+
labs(title="Il FMV dipende dal ruolo", x="ruolo", y = "fanta media voto")+
theme(plot.title = element_text(hjust = 0.5))Complessivamente quindi, gli attaccanti hanno una mediana del FMV superiore ai centrocampisti. Dallle analisi svolte si può quindi concluedere che esiste una dipendenza del FMV dal ruolo.
Si è visto come il FMV sia molto legato ai goal e agli assist, si procede ora andando a capire se ci sono altre variabili che incidono su questo. Si parte col vedere se all’aumentare delle presenze aumenta il FMV.
c<-giocatori%>%
ggplot(aes(x=P,y=FMV,color=ruolo,frame=anno))+
geom_point()+
theme_light()+
labs(title="FMV e presenze")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(c)## [1] 0.1219456
Da questo grafico si nota una nuvola di punti senza particolari trend. Andando a creare un modello che spiega il FMV tramite la variabile P e determinando l’R-quadro si conclude dicendo che non c’è¨ associazione tra le due variabili. In generale si dovrebbe considerare il FMV solo per quei giocatori con un numero abbastanza grande di presenze, queste perchè un giocatore con una sola presenza (che quindi ha giocato benissimo in quella partita) potrebbe avere il FMV più alto di uno che ha giocato tantissime partite; inoltre per il fantcalcio sono necessari giocatori in grado di garantire nmerose presenze. Nel proseguo dell’analisi quindi il FMV dovrà essere pesato con pesi, appunto, le presenze.
Ma c’è un’altra variabile che è molto correlata, ed è il MV. Infatti il punto di partenza per la determinazione del FMV è proprio il voto dato dalla Gazzetta dello Sport.
giocatori%>%
ggplot(aes(MV,FMV,color=ruolo))+
geom_point()+
geom_smooth(se=FALSE,method="lm")+
theme_light()+
labs(title="Andamento FMV vs MV")+
theme(plot.title = element_text(hjust = 0.5))## [1] 0.5637766
Nel complesso la correlazione non è molto alta, questo perchè per i giocatori con il ruolo di portieri il FMV è molto più basso, ad ogni goal subito viene tolto un punto e quindi per i portieri è molto più difficile avere un FMV alto (anche dalla matrice di correlazione si notava una correlazione inversa tra FMV e GSUB). Per gli altri ruoli si nota un trend lineare.
Le variabili maggiormente correlate con il FMV sono quindi: ruolo, goal, assist, goal subiti e MV. Costruiamo quindi un modello che spiega il FMV attraverso le variabili appena menzionate:
##
## Call:
## lm(formula = FMV ~ MV + ruolo + G + A + GSUB, data = giocatori)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.7224 -0.1200 -0.0276 0.0890 2.9077
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.7196372 0.1132895 -24.006 < 2e-16 ***
## MV 1.2433473 0.0182699 68.055 < 2e-16 ***
## ruoloD 1.2731116 0.0282223 45.110 < 2e-16 ***
## ruoloC 1.3159712 0.0282940 46.511 < 2e-16 ***
## ruoloA 1.4699671 0.0304953 48.203 < 2e-16 ***
## G 0.0787874 0.0019354 40.709 < 2e-16 ***
## A 0.0126627 0.0036582 3.461 0.000543 ***
## GSUB -0.0036172 0.0009019 -4.011 6.17e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2948 on 3666 degrees of freedom
## Multiple R-squared: 0.8413, Adjusted R-squared: 0.841
## F-statistic: 2776 on 7 and 3666 DF, p-value: < 2.2e-16
Queste variabili spiegano dunque l’84% della variabilità del FMV.
Si vuole ora vedere di ogni stagione, i 5 migliori giocatori (quelli con FMV maggiore) filtrando quelli con più di 10 presenze. In un grafico si visualizzano sull’asse delle x i Goal e sull’asse delle y il relativo FMV, dove pallini con dimensione maggiore indicano un maggior numero di assist effettuati:
d<-giocatori%>%
filter(P>10)%>%
group_by(anno)%>%
top_n(5,FMV)%>%
ggplot(aes(x=G, y=FMV,group=giocatore,frame=anno))+
geom_point()+
theme_light()+
labs(title="Migliori giocatori")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(d)e<-giocatori%>%
filter(anno==2017 & FMV>=7.5 & P>15)%>%
group_by(giocatore)%>%
select(anno,giocatore,squadra, ruolo, P, FMV, G, A)%>%
arrange(desc(FMV))%>%
ggplot(aes(x=G,y=FMV,color=giocatore, size=A))+
geom_point(alpha=1/2)+
theme_light()+
labs(title="Top della stagione 2017/2018")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(e)Per vedere tutto questo occorre far parlare le due tabelle, dobbiamo fare un inner_join in modo che tutti i valori della tabella giocatore trovino una corrispondenza nella tabella valutazioni.
valutaz<-giocatori%>%
inner_join(valutazioni)
valutaz%>%
ggplot(aes(x=valutazione,y=FMV))+
geom_point()+
theme_light()+
geom_smooth(se=FALSE,method="lm")+
labs(title="Grafico valutazione vs fanta media voto, diviso per anno")+
theme(plot.title = element_text(hjust = 0.5))+
facet_wrap(~ anno) Dando una rapida occhiata ai grafici sembrerebbe che il FMV sia correlato con la valutazione. Costruiamo un modello e andiamo a vedere quanta variabilità del FMV è spiegata dalla variabile valutazione:
##
## Call:
## lm(formula = FMV ~ P, data = giocatori)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.0176 -0.3249 -0.0367 0.3333 3.9824
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.494014 0.022358 245.73 <2e-16 ***
## P 0.023635 0.001047 22.58 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6929 on 3672 degrees of freedom
## Multiple R-squared: 0.1219, Adjusted R-squared: 0.1217
## F-statistic: 510 on 1 and 3672 DF, p-value: < 2.2e-16
valutaz<-valutaz%>%
add_residuals(mod3,"resid")
ggplot(valutaz, aes(valutazione,resid))+
geom_hex(bins=30) Il grafico dei residui fa capire che la variabile esplicativa non ha colto, per la maggior parte, la variabilità della varaibile risposta. Da tutto ciò si deduce che non bisogna basarsi solo sulle valutazioni iniziali pubblicate nel quotidiano sportivo.
La tabella squadre contiene informazioni sulle squadre degli ultimi 7 campionati di serie A. Ci sono delle squadre che non sono presenti in tutte le stagioni, quindi per questa analisi si considerano solo le squadre che sono presenti in tutti gli anni considerati, che sono le seguenti:
## # A tibble: 11 x 1
## squadra
## <chr>
## 1 ATALANTA
## 2 CHIEVO
## 3 FIORENTINA
## 4 GENOA
## 5 INTER
## 6 JUVENTUS
## 7 LAZIO
## 8 MILAN
## 9 NAPOLI
## 10 ROMA
## 11 UDINESE
Ci sono 11 squadre, per fare l’analisi se il FMV aumenta nel tempo consideremo solo queste. Si salva il risultao in una variabile squadre7.
Facciamo un join tra la tabella giocatori e la tabella squadre7 in modo da avere solo i giocatori di queste 11 squadre:
Per vedere l’evoluzione del FMV delle squadre nel tempo quello che occorre è, per i diversi anni, il fanta media voto di ogni squadra, dato dai FMV dei suoi giocatori. Per fare questo creiamo una variabile media che contiene appunto questo dato; si tratta di una media pesata con pesi le presenze (questo perchè vogliamo dare più peso a chi ha disputato più partite):
Partiamo con un grafico che mostra l’andamento delle squadre:
f<-FMVsquadra%>%
ggplot(aes(anno,media,color=squadra))+
geom_line()+
coord_cartesian(ylim = c(5,8))+
theme_minimal()
ggplotly(f)filter(FMVsquadra,squadra=="JUVENTUS")%>%
ggplot(aes(anno,media))+
geom_line()+
coord_cartesian(ylim = c(6,7))+
theme_minimal() Per capire il trend delle diverse squadre bisognerebbe generare 11 modelli diversi, che renderebbe lungo il procedimento; tramite il dataframe annidato risolviamo questo problema.
La tabella by_giocatori è formata da una colonna data che contiene per ogni squadra la lista degli anni e delle corrispondenti medie, possiamo quindi accedere agli elementi della lista; ad esempio accediamo all’ elemento che è la squadra JUVENTUS:
## # A tibble: 7 x 2
## anno media
## <int> <dbl>
## 1 2011 6.50
## 2 2012 6.43
## 3 2013 6.65
## 4 2014 6.50
## 5 2015 6.58
## 6 2016 6.51
## 7 2017 6.70
Creiamo la funzione di adattamento del modello:
Vogliamo applicare questa funzione ad ogni data frame, ma questi sono contenuti in una lista. Si utilizza allora purrr::map() per applicare questo modello ad ogni elemento. Creiamo una nuova variabile nel data frame by_giocatore con mutate():
Ora ci sono quindi 11 data frame e 11 modelli. Per aggiungere i residui bisogna chiamare la funzione add_residuals() per ogni coppia di modelli e dati usando la funzione map2().
Ora che abbiamo tutto quello che serve si vogliono produrre dei grafici. Ma c’è una lista di data frame che non possono essere graficati, allora si utilizza la funzione unnest() per passare da data frame annidato a data frame e si visualizzano i residui:
## # A tibble: 77 x 4
## squadra anno media resid
## <chr> <int> <dbl> <dbl>
## 1 ATALANTA 2011 6.17 0.253
## 2 ATALANTA 2012 5.89 -0.106
## 3 ATALANTA 2013 6.03 -0.0349
## 4 ATALANTA 2014 5.92 -0.227
## 5 ATALANTA 2015 6.05 -0.172
## 6 ATALANTA 2016 6.47 0.176
## 7 ATALANTA 2017 6.48 0.110
## 8 CHIEVO 2011 5.97 0.0780
## 9 CHIEVO 2012 5.89 -0.0209
## 10 CHIEVO 2013 5.77 -0.154
## # ... with 67 more rows
resids%>%
ggplot(aes(anno,resid))+
geom_line(aes(group=squadra),alpha=1/3)+
geom_smooth(se=FALSE)+
theme_minimal()+
coord_cartesian(ylim=c(-0.8,0.6)) Andiamo a vedere alcuni indicatori statistici con la funzione glance() del pacchetto broom:
by_giocatori<-by_giocatori%>%
mutate(glance=map(model,broom::glance))
unnest(by_giocatori,glance)
glance=unnest(by_giocatori, glance, .drop=TRUE)Ordiniamo in ordine descrescente della variabile r.squared e creiamo una variabile che tenga conto solo delle squadre con r.squared>0.3:
## # A tibble: 11 x 12
## squadra r.squared adj.r.squared sigma statistic p.value df logLik
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
## 1 INTER 7.00e-1 0.640 0.0879 1.17e+1 0.0189 2 8.26
## 2 UDINESE 5.03e-1 0.403 0.129 5.05e+0 0.0745 2 5.58
## 3 NAPOLI 4.77e-1 0.373 0.190 4.57e+0 0.0856 2 2.86
## 4 ATALAN~ 4.48e-1 0.337 0.200 4.05e+0 0.100 2 2.50
## 5 LAZIO 3.99e-1 0.279 0.211 3.32e+0 0.128 2 2.12
## 6 JUVENT~ 3.33e-1 0.200 0.0839 2.50e+0 0.175 2 8.59
## 7 ROMA 2.53e-1 0.103 0.206 1.69e+0 0.250 2 2.30
## 8 GENOA 1.93e-1 0.0319 0.140 1.20e+0 0.324 2 5.02
## 9 CHIEVO 1.70e-1 0.00440 0.0906 1.03e+0 0.357 2 8.06
## 10 MILAN 1.13e-1 -0.0639 0.164 6.40e-1 0.460 2 3.89
## 11 FIOREN~ 5.65e-6 -0.200 0.183 2.83e-5 0.996 2 3.12
## # ... with 4 more variables: AIC <dbl>, BIC <dbl>, deviance <dbl>,
## # df.residual <int>
Le squadre che in questi anni hanno avuto un miglioramente nel fanta media voto aggregato quindi l’Inter e l’Udinese e il Napoli. Per tutte le altre squadre abbiamo un r quadro non molto alto, con oscillazoni di anno in anno del fanta media voto.
Come nel caso precedente, andiamo a creare il FMV aggregato di ogni squadra nei diversi anni (è una media pesata con pesi le presenze dei giocatori):
mediapesata<-giocatori%>%
group_by(anno,squadra)%>%
summarize(FantaMediaVoto=sum(FMV*P)/sum(P))
relazione<-mediapesata%>%
inner_join(squadre)
h<-relazione%>%
ggplot(aes(x=FantaMediaVoto,y=punti,group=squadra,frame=anno))+
geom_point()+
labs(title="All'aumentare del FMV aggregato aumenta il punteggio")+
theme(plot.title = element_text(hjust = 0.5))
ggplotly(h)##
## Call:
## lm(formula = punti ~ FantaMediaVoto, data = relazione)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.363 -4.578 -0.490 4.815 13.982
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -343.693 13.790 -24.92 <2e-16 ***
## FantaMediaVoto 65.085 2.266 28.72 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.729 on 138 degrees of freedom
## Multiple R-squared: 0.8567, Adjusted R-squared: 0.8557
## F-statistic: 825.1 on 1 and 138 DF, p-value: < 2.2e-16
Quasi l’86% del punteggio finale di una squadra è spiegato attraverso il FMV aggregato dei giocatori che compongono quella squadra.
relazione1<-relazione%>%
add_residuals(mod4,"resid")
ggplot(relazione1, aes(FantaMediaVoto,resid))+
geom_point()+
coord_cartesian(ylim=c(-30,30)) Il grafico dei residui non mostra particolari andamenti, questo vuol dire che il modello è buono.
Si va a guardare ora la tabella relazione per vedere eventuali associazioni tra le variabili:
relazionequant<-select(relazione,-squadra)
squadrecorr<-cor(relazionequant)
corrplot(squadrecorr,method="ellipse", diag=FALSE, order="hclust", title="Correlazioni tra le variabili delle squadre", mar=c(1,2,3,2)) Da questa tabella capiamo come la variabile punti, oltre ad essere fortemente legata al FMV, è correlata positivamente con i goal fatti (in casa e in trasferta) ed è correlata negativamente con i goal subiti (in casa e in trasferta). Ma quello che si vuole capire è se esiste un vantaggio a giocare in casa.
squadrecasa<-squadre%>%
group_by(squadra)%>%
summarize(PropVittCasa=sum(VC)/sum((VC+VT)),PropVittTrasf=sum(VT)/sum((VC+VT)))%>%
inner_join(squadre7)
billboarder() %>%
bb_barchart(
data = squadrecasa[,c("squadra", "PropVittCasa", "PropVittTrasf")],
stacked = TRUE, rotated = TRUE
) %>%
bb_y_grid(show = TRUE)andamento<-squadre%>%
group_by(squadra)%>%
summarize(vittcasa=sum(VC),vitttrasf=sum(VT), sconfcasa=sum(SC), sconftrasf=sum(ST))
billboarder() %>%
bb_barchart(
data = andamento[, c("squadra", "vittcasa", "vitttrasf","sconfcasa", "sconftrasf")],
stacked = TRUE, rotated = TRUE
) %>%
bb_y_grid(show = TRUE)%>%
bb_labs(title = "Andamento squadre")Nelle ultime 7 stagioni la Juventus è riuscita ad arrivare sempre prima. Di seguito un’analisi generale tenendo conto di tutti questi anni:
analisiJuve<-relazione%>%
inner_join(squadre7)%>%
group_by(squadra)%>%
summarize(TotGoalCasa=sum(GF_CASA), TotVittCasa=sum(VC), TotVittTrasf=sum(VT),FMV =mean(FantaMediaVoto))%>%
arrange(desc(FMV))
analisiJuve## # A tibble: 11 x 5
## squadra TotGoalCasa TotVittCasa TotVittTrasf FMV
## <chr> <int> <int> <int> <dbl>
## 1 JUVENTUS 298 112 85 6.55
## 2 NAPOLI 308 91 68 6.43
## 3 ROMA 279 85 68 6.38
## 4 LAZIO 252 76 53 6.22
## 5 INTER 236 68 53 6.18
## 6 FIORENTINA 225 67 52 6.16
## 7 ATALANTA 180 59 35 6.15
## 8 MILAN 212 76 49 6.10
## 9 UDINESE 189 59 33 6.05
## 10 GENOA 186 53 26 6.00
## 11 CHIEVO 141 44 35 5.95
La potenza di questa squadra può essere brevemente spiegata dicendo che, in queste ultime 7 stagioni, è la squadra con più goal fatti in casa, con più vittorie in casa ed è inoltre la squadra che è riuscita a fare più vittorie in trasferta e quella con il fanta media voto (media degli ultimi 7 anni) più alto. Graficamente la situazione è la seguente:
In conclusione, questa analisi in cosa ci può essere di aiuto nel caso decidessimo di partecipare al Fantacalcio? Abbiamo capito diverse cose; inanzitutto non bisogna basarsi solo sulla valutazione iniziale per decidere i giocatori da prendere, quindi la strategia “compro i giocatori che hanno una valutazione più alta” è da rivedere. Questo perchè a valutazioni basse potrebbero corrispondere alti FMV a fine anno (giocatori che disputano una stagione sopra le aspettative) o, al contrario, a valutazioni alte corrispondono FMV bassi (giocatori sopravvalutati ad inizio anno, perchè magari hanno disputato un’ottima stagione in precedenza, non confermano le aspettative). Tra i bonus/malus, quelli che sono maggiormente correlati con il FMV sono:
Goal e assist: coloro che segnano di più sono gli attaccanti e coloro che effettuano più assist sono sia attaccanti che centrocampisti.
Goal subiti dal portiere: i portieri raggiungono difficilmente un FMV elevato, questo perchè sono soggetti a più malus che bonus, scegliere ad inizio anno il portiere che subirà meno goal non è affatto facile.
Bisogna scegliere alcuni attaccanti o centrocampisti che, basandosi sulla stagione passata o al limite sulle ultime due stagioni, hanno avuto un fanta media voto alto. Però bisogna anche rischiare, scommettere su alcuni giocatori promettenti (la cui valutazione iniziale è bassa ma portebbero fare un ottimo campionato). Un altro consiglio potrebbe essere quello di prendere giocatori della squadra che negli ultimi anni si è posizionata bene in classifica. Consigli su chi schierare di giornata in giornata: c’è una maggior probabilità per le squadre di vincere in casa (la squadra che vince ovviamente segnerà almeno 1 goal) quindi se ci sono centrocampisti o attaccanti che giocano in casa conviene schierarli in campo. Detta così sembrerebbe davvero semplice, ma non lo è affatto. A tutto questo concorrono moltissime variabili non prevedibili a priori come ad esempio il calo di forma, il rapporto tra il calciatore e l’allenatore, eventuali infortuni, solo per elencarne alcune. Non c’è nulla di certo, in fondo prendere alcuni giocatori piuttosto che altri potrebbe essere vista come una scommessa, dove quindi ci vuole sempre un pizzico di fortuna!